
package com.gxm.jar.netty.序列化;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

public class NettyServer2 {

	public static void main(String[] args) {
		try {
			// 配置服务端的NIO线程组
			EventLoopGroup bossGroup = new NioEventLoopGroup();
			EventLoopGroup workerGroup = new NioEventLoopGroup();
			try {
				ServerBootstrap b = new ServerBootstrap();
				b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
						.option(ChannelOption.SO_BACKLOG, 100).handler(new LoggingHandler(LogLevel.INFO))
						.childHandler(new ChannelInitializer<SocketChannel>() {
							@Override
							public void initChannel(SocketChannel ch) {
								ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());
								ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());
								ch.pipeline().addLast(new SubReqServerHandler());
							}
						});

				// 绑定端口，同步等待成功
				ChannelFuture f = b.bind(8086).sync();

				// 等待服务端监听端口关闭
				f.channel().closeFuture().sync();
			} finally {
				// 优雅退出，释放线程池资源
				bossGroup.shutdownGracefully();
				workerGroup.shutdownGracefully();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}
